// 使用泛型创建一个函数

// <Type>中的Type可以随意写
// <Type>是用于站位，等函数调用的时候传入对应的类型即可
function id<Type>(value: Type): Type {
  return value
}

// 调用泛型函数
// 1.以 number 类型调用泛型函数
const num = id<number>(10)
// 泛型简化使用方式
const num1 = id(100)

// 2.以 string 类型调用泛型函数
const str = id<string>('a')
// 泛型简化使用方式
const str1 = id('abc')

// 3.以 boolean 类型调用泛型函数
const boo = id<boolean>(false)
// 泛型简化使用方式
const boo1 = id(false)

// 泛型指定具体类型 如 - 使用传入value值的.length属性
function ids<Type>(value: Type[]): Type[] {
  console.log(value.length)
  return value
}

// 泛型约束 演示
interface Ilength {
  length: number
}
// 此处 Type extends Ilength不是继承 而是约束
// 泛型中传入的条件必须符合 Ilength中的需求
// 即 传入的类型必须具有length属性
function idss<Type extends Ilength>(value: Type): Type {
  console.log(value.length)
  return value
}

idss([1, 2, 3])
// idss(123) // 错误 123 没有length属性
idss('1234')
idss({ length: 10, name: 'zhangsan' })
